require 'sketchup.rb'
require File.join(__FILE__, '../amtf_mixin.rb')
module AMTF
  class AF另存排版
    include AMTF_mixin
    def 另存为排版模型
      Sketchup::set_status_text __method__.to_s()+" ing"
      设置常用对象
      file=@model.path
      # p @model.path
      路径 = File.dirname(file).freeze
      文件名 = File.basename(file, '.*')
      today = Time.new;
      时间后缀= today.strftime("%Y%m%d_%H%M%S");
      另存文件名=文件名
      if 另存文件名.include? '_排版'
        另存文件名=另存文件名.gsub!(/_排版\S*/, "")
      end
      另存文件名=另存文件名+'_排版'+时间后缀
      另存全名=路径+'/'+另存文件名+'.skp'
      status = @model.save(另存全名)
      Sketchup::set_status_text __method__.to_s()+另存全名+" 完成！"
    end
    def 删除指定图层
      Sketchup::set_status_text __method__.to_s()+" ing"
      设置常用对象
      层s=@model.layers
      拟删除层=[]
      拟删除层名称=[]
      p 层s.size
      层s.each {|e|
        p e
        if e.name=~ /afu-参考|afu-五金|afu-尺寸标注|afu-开向|afu-拉手|afu-明装拉手/
        # if e.name=~ /五金/
          # 层s.remove(e,true)
          拟删除层.push e
          拟删除层名称.push e.name
        end
      }
      拟删除层.each {|e|
          层s.remove(e,true)
      }
      提示信息="已删除图层："+拟删除层名称.to_s
      Sketchup::set_status_text 提示信息
    end

    def 删除隐藏项目()
      设置常用对象
      @entities.each {|e|
        删除隐藏项目主体(e)
      }
    end
    def 删除隐藏项目主体(e)
      if e.hidden?
        begin
          提示名= e.name
        rescue Exception => e
          p e
          提示名= e.to_s
        end
        if 提示名==""
          提示名=e.definition.name
        end
        if 提示名==""
          提示名=e.to_s
        end
        提示信息="删除:"+提示名
        p 提示信息
        p "删除隐藏组件内存名:"+e.to_s
        发送提示信息(提示信息)
        begin
          e.erase!
        rescue Exception => e
          p e
        end
      else
        if ( e.is_a?( Sketchup::ComponentInstance ) || e.is_a?( Sketchup::Group ))
          e.definition.entities.each{|ee|
            删除隐藏项目主体(ee)
          }
        end
      end
    end

    def 删除or炸开无板字组件()
      设置常用对象
      @组件定义名_实例对象h=Hash[]
      @实例对象h_组件定义名=Hash[]
      @含板字组件路径=Hash[]
      @不含板字组件路径=Hash[]
      @含板字组件=[]
      @计数=0
      @entities.each {|e|
        递归路径=[]
        # p "顶层e:"+e.to_s
        递归识别组件(e,递归路径)
      }
      # 断点……………….nil

      含板字组件路径a=[]
      @含板字组件路径.each {|k,v|
        # p "含板字组件::::"+k.definition.name
        含板字组件路径a.concat(v)
        # 含板字组件路径名称=v.map{ |vv| vv.definition.name }
        # p "含板字组件路径::::"+含板字组件路径名称.to_s
        # p "含板字组件路径::::"+含板字组件路径a.to_s
      }
      含板字组件路径a.uniq!

      不含板字组件路径a=[]
      @不含板字组件路径.each {|k,v|
        # p "不含板字末级组件::::"+k.definition.name
        不含板字组件路径a.concat(v)
      }
      不含板字组件路径a.uniq!
      # p "不含板字组件路径a::::"+不含板字组件路径a.to_s
      # 断点……………….nil

      差集=不含板字组件路径a - 含板字组件路径a
      差集.each {|实例|
        # 实例=definitions[n]
        提示信息="删除:"+实例.definition.name
        p 提示信息
        begin
          实例.erase!
          发送提示信息(提示信息)
        rescue Exception => e
          p e
        end
      }
      # 断点……………….nil

      #路径会有重复，需要排除，然后再反顺序炸开组件
      # "含板字组件路径::::[\"通用地柜#7\"]"
      # "炸开:通用地柜#7"
      # "含板字组件路径::::[\"通用地柜#7\"]"
      # "炸开:通用地柜#7"
      # "含板字组件路径::::[\"通用地柜#7\", \"参数拉条#4\"]"
      拟炸开组件路径=[]
      @含板字组件路径.each {|k,v|
        # p "含板字组件::::"+k.definition.name
        可能重复组件路径=v
        # 含板字组件路径名称=v.map{ |vv| vv.definition.name }
        # p "含板字组件路径::::"+含板字组件路径名称.to_s
        # p "组件路径::::"+v.to_s
        存在重复=false
        拟炸开组件路径.each {|e|
          重复项=可能重复组件路径 & e
          if 重复项==e
            重复项名称=重复项.map{ |vv| vv.definition.name }
            # p "重复项名称::::"+重复项名称.to_s
            拟炸开组件路径.delete(e)
            拟炸开组件路径.push(可能重复组件路径.dup)
            存在重复=true
          end
        }
        if !存在重复
          拟炸开组件路径.push(可能重复组件路径.dup)
        end
      }

      拟炸开组件路径.each {|e|
        # 名称=e.map{ |vv| vv.definition.name }
        # p "拟炸开组件路径名称::::"+名称.to_s
        e.reverse_each {|实例|
          begin
            # 提示信息="炸开:"+实例.definition.name
            # p 提示信息
            实例.explode
            # 发送提示信息(提示信息)
          rescue Exception => e
            p e
          end
        }
      }
      发送提示信息("方法完成")
    end

    def 递归找可删除组件(e,递归路径)
      @是末级组件=true
      if e.is_a? Sketchup::ComponentInstance or e.is_a? Sketchup::Group
        @计数+=1
        @是末级组件=false
        @子件含板字=false
        组件定义名=e.definition.name#!!!不能用定义名唯一代替实例名
        # @组件定义名_实例对象h[组件定义名]=e#方便后面调用删除命令
        @实例对象h_组件定义名[e]=组件定义名#方便后面调用删除命令!!!不同组件中可能会包含同一个的末级组件
        关键词位置= 组件定义名=~ /铰链|智能|参数|侧封板/
        if 组件定义名.include? '板' and 关键词位置==nil
          # 递归路径.push 组件定义名
          # p 递归路径.to_s  #会影响兄弟组件的递归路径变量
          @含板字组件.push e
          @子件含板字=true
          # @含板字组件路径[组件定义名]=递归路径.dup
          @含板字组件路径[@计数]=递归路径.dup
          # puts "含板字路径：\n"+递归路径.to_s
        else
          # 往下一层
          递归路径.push e
          # p 递归路径.to_s
          entities = e.definition.entities
          entities.each {|ee|
            递归找可删除组件(ee,递归路径.dup)
          }
          #递归已经到底……开始逐层返回↓
          if @子件含板字==false
            if @是末级组件
              # @不含板字组件路径[组件定义名]=递归路径.dup
              @不含板字组件路径[@计数]=递归路径.dup
              @是末级组件=false#递归返回是只认最先返回的是末级组件
            end
          end
          #递归已经到底……开始逐层返回↑
        end
      end
    end
    def 递归识别组件(e,递归路径)
      @是末级组件=true
      if e.is_a? Sketchup::ComponentInstance or e.is_a? Sketchup::Group
        @计数+=1
        @是末级组件=false
        @子件含板字=false
        # @是组件=true
        组件定义名=e.definition.name#!!!不能用定义名唯一代替实例名
        # @组件定义名_实例对象h[组件定义名]=e#方便后面调用删除命令
        @实例对象h_组件定义名[e]=组件定义名#方便后面调用删除命令!!!不同组件中可能会包含同一个的末级组件
        # if e.is_a? Sketchup::Group
        #   p e
        #   p '组件定义名:'+组件定义名
        # end
        # p e
        # p '组件定义名:'+组件定义名
        关键词位置= 组件定义名=~ /铰链|智能|参数|侧封板/
        if 组件定义名.include? '板' and 关键词位置==nil
          # 递归路径.push 组件定义名
          # p 递归路径.to_s  #会影响兄弟组件的递归路径变量
          @含板字组件.push e
          @子件含板字=true
          # @含板字组件路径[组件定义名]=递归路径.dup
          @含板字组件路径[@计数]=递归路径.dup
          # puts "含板字路径：\n"+递归路径.to_s
        else
          # 递归路径.push 组件定义名
          递归路径.push e
          # p 递归路径.to_s
          entities = e.definition.entities
          entities.each {|ee|
            递归识别组件(ee,递归路径.dup)
          }
          #递归已经到底……开始逐层返回↓
          if @子件含板字==false
            if @是末级组件
              # @不含板字组件路径[组件定义名]=递归路径.dup
              @不含板字组件路径[@计数]=递归路径.dup
              @是末级组件=false#递归返回是只认最先返回的是末级组件
            end
          end
          #递归已经到底……开始逐层返回↑
        end
      end
    end

    def 炸开所有子组件
      设置常用对象
      @层级h=Hash[]
      ents=[]
      if @selection.count > 0
        @selection.each {|e|
          if ( e.is_a?( Sketchup::ComponentInstance ) || e.is_a?( Sketchup::Group ))
            ents.push e
          end
        }
      end
      p ents.count == 0
      ents=@entities if ents.count == 0
      ents.each {|e|
        if ( e.is_a?( Sketchup::ComponentInstance ) || e.is_a?( Sketchup::Group ))
          当前层级=0
          炸开所有子组件主体(e,当前层级)
        end
      }
      发送提示信息("方法完成")
    end

    def 组件改名
      设置常用对象
      ents=@entities
      提示信息a=[]
      ents.each {|e|
        if ( e.is_a?( Sketchup::ComponentInstance ) || e.is_a?( Sketchup::Group ))
          组件名=e.definition.name
          组件名= 组件名.gsub!(/\S*通用|智能|参数/, "")
          if 组件名!=nil
            e.definition.name=组件名
            提示信息a.push 组件名
          end
        end
      }
      发送提示信息("方法完成")
    end

    def 组件转群组
      设置常用对象
      ents=@entities
      提示信息a=[]
      ents.each {|e|
        if e.is_a?( Sketchup::ComponentInstance )
          组件名=e.definition.name
          p 组件名
          begin
            eee=e.explode
            # p eee
            # group = @entities.add_group()
            # group.name=组件名
            # entities2 = group.entities
            # entities2.add_face(*eee)
            fs=[]
            eee.each {|e|
              if e.is_a?( Sketchup::Face )
                fs.push e
              end
            }
            # entities2.add_face(fs)
            group = @entities.add_group(fs)
            group.name=组件名
          rescue Exception => e
            p e
          end


        end
      }
      发送提示信息("方法完成")
    end

    def 一键排版预处理
      另存为排版模型
      删除指定图层
      设置常用对象
      删除隐藏项目

      清除未使用

      删除or炸开无板字组件
      炸开所有子组件
      组件改名
      组件转群组
      发送提示信息("方法完成")
    end

    def 删除多余元素(entities,拟删除元素)
      for e in entities.to_a
        if !(e.is_a?( Sketchup::Face ) || e.is_a?( Sketchup::ComponentInstance ) || e.is_a?( Sketchup::Group ))
          if e.is_a?( Sketchup::Edge )
            faces = e.faces
            # p faces.size
            if faces.size<1
                # e.erase!
                拟删除元素.concat(拟删除元素)
            end
          else
            # e.erase!
            拟删除元素.concat(拟删除元素)
          end
        end
      end
    end
  end#class

end # module amtf_su
